import axios from 'axios'


// 设置基地址
const request = axios.create({
    // baseURL: 'http://toutiao.itheima.net/'
    baseURL: 'http://geek.itheima.net/'
})


// 导入store
import store from '@/store'
// 导入router
import router from '@/router'
// 导入Toast
import { Toast } from 'vant'

// 我们项目里发请求用的是request对象，所以你要拦截，也应该是拦截request
request.interceptors.request.use(function (config) {

    // 这个函数会在正常请求时拦截下来（请求即将发出时拦截下来，调用这个函数）
    // 参数config就是你本次请求的请求信息
    // console.log(123, config)

    // 如果有token才加这个请求头，不然不加（例如登录就没有token）
    if (store.state.tokenObj.token) {
        // 请求发出前，给请求头携带好token
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }

    // 在发送请求之前做些什么
    return config;

}, function (error) {

    // 发请求出错调用的函数（用不到，可以无视）
    // 对请求错误做些什么
    return Promise.reject(error);
});



// 响应拦截
request.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;

}, async function (error) {

    // 服务器网络不通报错，你也给我去刷新token就不合理
    // 所以我们要判断，只能是token失效的错误，才做如下处理
    if (error.response.status === 401) {

    try {
        // 写代码发请求，利用refresh_token去请求一个新的token
        // 如果用reqest对象发请求，就会触发request的请求拦截
        // 而触发请求拦截后会把Authorization里的refresh_token给重新赋值覆盖掉
        // 所以服务器要报错,所以直接用axios对象发请求，但是这时候要设置完整地址
        let res = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: {
                Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
            }
        })

        // 请求到后，再把新的token存到vuex和本地存储
        // 这里不能直接存res.data.data，因为这里只有token
        // 如果你直接存了就会把我们的refresh_token弄没了
        // 所以我们需要手动写一个对象，里面包含token和之前的refresh_token
        store.commit('setToken', {
            token: res.data.data.token,
            refresh_token: store.state.tokenObj.refresh_token
        })

        // 得到新的token后，我们就直接再次写代码利用新的token
        // 把之前token过期的那个请求再用新token请求一次
        // 得到结果后，再把结果return出去
        // 如何把之前你发的旧token的请求再利用新token发一次呢？
        // error对象里的config就拥有之前请求的所有信息
        // 所以利用config再发一次请求即可
        let newRes = await request(error.config)
        return newRes
    }catch {

        // 进到catch里就证明上面的请求有错，那进一步说refresh_token就过期了
        // 所以该打回登录页，让它重新登录
        // 还得弹出一个提示
        Toast.fail('登录状态已失效，请重新登录')
        router.push('/login')
    }

    } else {

        // 只要不是token过期问题，那么该什么错就报什么错
        // 对响应错误做点什么
        return Promise.reject(error);
    }
});


// 把对象暴露出去
export default request